package com.owc.service.app;

import com.owc.common.sdk.Client;
import com.owc.common.sdk.client.WalletClient;
import com.owc.domain.BaseResult;
import com.owc.domain.WalletAddress;
import com.owc.domain.dto.*;
import com.owc.domain.entity.Token;
import com.owc.domain.vo.app.TokenDetailVo;
import com.owc.domain.vo.app.TransferVo;
import org.springframework.lang.NonNull;

import java.math.BigDecimal;
import java.util.List;

/**
 * @Author Jackies
 * @Date 2019/12/3 21:41
 * @Description TODO://
 **/
public interface WalletService {

    /**
     * Get current login user token detail list.
     */
    List<TokenInfo> getTokenList();

    /**
     * Get token balance detail.
     */
    BaseResult<TokenDetail> getTokenDetailList(TokenDetailVo tokenDetailVo);

    /**
     * 转账
     */
    Boolean transfer(TransferVo transferVo) throws Exception;
    /**
     * Build default wallet server client.
     * @return Client
     */
    static Client buildClient(){
        return new WalletClient();
    }

    /**
     * Get token balance.
     * @param tokenId tokenId
     * @return balance
     */
    @NonNull
    BalanceDTO getTokenBalance(Long tokenId);

    /**
     * Get token balance by userId
     * @param tokenId  tokenId
     * @param userId   userId
     * @return balanceDto
     */
    @NonNull
    BalanceDTO getTokenBalanceByUserId(Long tokenId,Long userId);

    /**
     * 获取正在交易中(待审核,区块确认中)的转账金额
     * @param tokenId  代币ID
     * @param userId   用户ID
     * @return 金额
     */
    BigDecimal getWithdrawAmountByToken(Long tokenId,Long userId);

    /**
     * 根据tokenId获取钱包地址
     * @param tokenId Token Id
     */
    TokenAddress getTokenAddress(@NonNull Long tokenId);

    /**
     * 根据tokenId获取手续费
     */
    TokenHandlingFee getTokenHandlingFee(Long tokenId);

    /**
     * 获取流水详情
     */
    FlowDetail getFlowDetail(@NonNull String flowId);

    /**
     * 获取用户收益情况
     */
    UserIncome getUserIncomeInfo();

    /**
     * 获取token信息
     * @param tokenName tokenName
     * @return token实体类
     */
    Token getTokenByName(String tokenName);

    /**
     * 获取代币冻结余额
     */
    BigDecimal getTokenFreezeBalance(Long tokenId,Long userId);

    /**
     * 根据钱包地址获取用户id
     * @param address 钱包地址
     * @return userId
     */
    Long getUserByAddress(String address);
}
